    package infb.dao;

import infb.modelo.Citas;
import infb.modelo.Medicos;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.*;
import javax.persistence.Query;


@Stateless(mappedName="CitasEJB")
public class CitasBean implements CitasInterfaz {
    @PersistenceContext
    private EntityManager em;

    public void create(Citas citas) {
        em.persist(citas);
    }

    public void edit(Citas citas) {
        em.merge(citas);
    }

    public void remove(Citas citas) {
        em.remove(em.merge(citas));
    }

    public Citas find(Object id) {
        return em.find(Citas.class, id);
    }

    public List<Citas> findAll() {
        return em.createQuery("select object(o) from Citas as o").getResultList();
    }   

    public List<String> horasOcupadas(String dni, String fecha) {

        List<String> res;
        res = (List<String>) em.createNativeQuery("select c.hora_Finalizacion from Citas c where c.medico=?1 and c.fecha_finalizacion like ?2 and c.estado='Pendiente'")
                .setParameter(1, dni)
                .setParameter(2, fecha)
                .getResultList();
        return res;
    }

    public List<Date> diasOcupados(String dni,int tope,String hoy){
        List<Date> res;
        res = (List<Date>) em.createNativeQuery("select c.fecha_Finalizacion from Citas c where c.medico=?1 and c.estado='Pendiente' and c.fecha_finalizacion>?3 group by c.fecha_finalizacion having count(*)>=?2")
                .setParameter(1, dni)
                .setParameter(2, tope)
                .setParameter(3, hoy)
                .getResultList();
        return res;
    }
     
     public List<Citas> citasMedico(Medicos medico, List estados){
        String sql="select c from Citas c where c.medico=?1 ";
        if(estados.size()>0){
            sql+="and (";
            Iterator it=estados.iterator();
            while(it.hasNext()){
                String estado=(String)it.next();
                sql+="upper(c.estado)='"+estado.toUpperCase()+"'";
                sql+=it.hasNext()?" or ":")";
            }
        }
        sql+=" order by c.fechaFinalizacion desc,c.horaFinalizacion desc";
        Query consulta=em.createQuery(sql);

        return consulta.setParameter(1, medico).getResultList();
    }

    public List<Citas> citasPaciente(String paciente, List estados){
        String sql="select c from Citas c where upper(c.paciente)=?1 ";
        if(estados.size()>0){
            sql+="and (";
            Iterator it=estados.iterator();
            while(it.hasNext()){
                String estado=(String)it.next();
                sql+="upper(c.estado)='"+estado.toUpperCase()+"'";
                sql+=it.hasNext()?" or ":")";
            }
        }
        sql+=" order by c.fechaFinalizacion desc,c.horaFinalizacion desc";
        Query consulta=em.createQuery(sql);

        return consulta.setParameter(1, paciente.toUpperCase()).getResultList();
    }
    public List <Citas> citasMovil(String paciente){
        List<Citas> res;
        res = (List<Citas>) em.createQuery("select c from Citas c where c.paciente=?1 and c.estado='Pendiente'")
                .setParameter(1, paciente)
                .getResultList();
        return res;


    }
     public List <Citas> citasMovilMedico(String medico){
        List<Citas> res;
        res = (List<Citas>) em.createNativeQuery("select c.* from Citas c where c.medico like ?1 and c.estado='Pendiente'",Citas.class)
                .setParameter(1, medico)
                .getResultList();
        return res;


    }

}
